iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Software Development

MYSQL-相關實務操作學習紀錄系列 第 12

Day.12 主從搭建 - 部署流程(Master Slave Replication )

  • 分享至 

  • xImage
  •  

了解昨天提到的主從運作流程後,今天來實際搭建主從架構~

在前面我們起了一台VM當作Master,現在在新增一台VM當作Slave,讓Slave能夠連接到Master完成主從複製功能。 ps.參考Day.3 部署流程

跳過Slave部署mysql流程. . .

1.確認Master配置有開啟binlog設定 (設定檔: /etc/mysql/my.cnf)

[mysqld]

#確保與要連線的slave ID不同(唯一)
server-id = 1

#binlog(ON)&設定檔名以mysql-bin開頭
log-bin = mysql-bin      <- (確認有設定)

#binlog的格式(模式:row/statement/mixed)
binlog-format = row

#保留x天binlog (default:0,表示不自動刪除)
expire_logs_days = 1

#寫緩衝x次,刷一次磁碟(0:預設系統每隔一段時間重整快取資料到磁碟,1:每次事務提交就會寫入磁碟,N:每N個事務提交...)
sync-binlog = 1

...

  1. 在Master上新增一組使用者帳密授予備份權限用於主從同步。
mysql> CREATE USER 'replicate'@'%' IDENTIFIED BY '1234';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'%';

mysql> FLUSH PRIVILEGES;

https://ithelp.ithome.com.tw/upload/images/20210825/20130880vSUCMkgHNP.png

  1. 備份Master上的資料庫資料傳至Slave服務器匯入 & 確認目前binlog執行位置 (沒資料的話跳過...)
root@mysql-master-1:/mnt/mysql_data/mysql# mysqldump -uroot -p1234  --routines --events --single-transaction --master-data=2 --flush-logs --all-databases > 

https://ithelp.ithome.com.tw/upload/images/20210828/20130880oCa5a8UwzB.png

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  1. 更改slave設定檔後重啟mysql服務
[client]
#mysql 客戶端連線服務端預設port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock

[mysqld]
#mysql使用socket方式登陸的sock檔案路徑
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 資料庫檔案所在目錄
datadir=/mnt/mysql_data/mysql
#錯誤日誌路徑
log-error=/var/log/mysql/error.log
#mysql服務端預設監聽port
port=3306

# 設定字符集utf8
character_set_server=utf8

#slow log是否開啟(1啟用/0禁用)
slow-query-log = 1
#慢查詢日誌路徑&檔名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#執行超過x秒就紀錄 (EX: 1s)
long_query_time = 1

#服務器ID,注意要與master的server_id不同(唯一)
server-id = 2
#relay_log 配置中繼日誌
relay-log=/mnt/mysql_data/mysql/slave1-relay-bin
#只讀狀態
read_only = 1

#====slave crash-safe====
#master.info和relay-log.info內容寫入DB:mysql中的表
master_info_repository = TABLE
relay_log_info_repository = TABLE
#意外時重啟後會忽略未被執行的relay log,重新連接master獲取relay log來進行恢復
relay-log-recovery = 1

...

root@mysql-slave-1:/mnt/mysql_data/mysql# systemctl restart mysql
  1. 登入slave設定主從
  • master_host : master的ip地址
  • master_user : 設定要連接的使用者 (前面新增的replicate使用者)
  • master_password : 設定要連接master的密碼
  • master_log_file & master_log_pos : 步驟3. master備份完的binlog文件和位置
mysql> change master to master_host='10.128.0.4',master_user='replicate',master_password='1234',master_log_file='mysql-bin.000004',master_log_pos=154;

mysql> start slave;

最後確認一下狀態是否成功連接就完工啦/images/emoticon/emoticon34.gif
https://ithelp.ithome.com.tw/upload/images/20210828/20130880tYpFoUAbZv.png

如果主從有同步異常停止時,會造成讀取資料不一致,影響業務上運作。

所以如何快速第一時間檢視問題點 ?

1.透過show slave status 瀏覽狀態
2.錯誤日誌

ex.假設今天先在slave刪掉了一筆紀錄。那當我在master執行刪除同一筆資料,語法同步至slave時會產生該筆資料不存在的問題,等於SQL-thread提取的日誌無法應用在slave上會噴下圖1032錯誤,造成同步失敗停止。因為對於slave來說該筆資料早就被刪除了!!
https://ithelp.ithome.com.tw/upload/images/20210828/20130880zPDshyqgWN.png

以上面例子來說可以看到錯誤提示為在Master-(mysql-bin.000004, end_log_pos 1010)位置的DELETE事件錯誤,由於在slave上要執行刪除的資料已經不存在,所以在這邊我們可以透過還原被刪除的資料,逆向手動執行INSERT那筆要被刪除的資料讓DELETE語法能順利執行。

  • 首先在master上透過錯誤提示位置找到該event紀錄的詳細欄位資訊用來還原該筆資料。
    https://ithelp.ithome.com.tw/upload/images/20210828/20130880ti6YiMAgfo.png

  • 在slave上執行還原插入資料後重啟複製線程

mysql> insert into user.user_powers(user_id,nick_name,group_id) values(23122141,'kiki',1242000);

mysql> start slave;

以上算是針對該問題安全解決的做法。但有時看情況也可選擇直接跳過該錯誤Event,如果不會影響到資料的一制性(ex.本例)

mysql> stop slave;

#代表跳過這1個event
mysql> SET GLOBAL sql_slave_skip_counter = 1;  

mysql> start slave;

提供2種方式沒問題的話就可以看到Slave_SQL_Running狀態恢復成YES正常運作啦~/images/emoticon/emoticon01.gif


上一篇
Day.11 搞懂主從架構- 主從複製(Master Slave Replication)
下一篇
Day.13 Crash Recovery - InnoDB 架構 -> MYSQL 二階段提交(2PC) _1
系列文
MYSQL-相關實務操作學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言